package com.jwt.token.util;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.JWTDecodeException;
import com.auth0.jwt.interfaces.DecodedJWT;
import org.springframework.beans.factory.annotation.Value;

import java.sql.Date;
import java.util.HashMap;
import java.util.Map;

public class TokenUtil {
    /**
     * 15分钟过期
     */
    private static final long EXPIRE_TIME = 24 * 60 * 60 * 1000;

    public static final String TOKEN_SECRET = "thefirsttoken123";


    /**
     * 生成签名，15分钟过期
     *
     * @param **username**
     * @param **password**
     * @return
     */
    public static String sign(String userId, String userName,String jwtKey) {
        try {
            // 设置过期时间
            Date date = new Date(System.currentTimeMillis() + EXPIRE_TIME);
            // 私钥和加密算法  // 使用HMAC SHA256签名算法。
            // HMAC（全称Hash-based Message Authentication Code），基于Hash函数和密钥的消息认证码。
            Algorithm algorithm = Algorithm.HMAC256(jwtKey);
            // 设置头部信息
            Map<String, Object> header = new HashMap<>();
            header.put("Type", "Jwt");
            header.put("alg", "HS256");
            // 返回token字符串
            return JWT.create()
                    .withHeader(header)
                    // 签发对象
                    .withAudience(userId)
                    // 载荷
                    .withClaim("loginName", userName)
                    // 过期时间
                    .withExpiresAt(date)
                    // 签名
                    .sign(algorithm);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    /**
     * 检验token是否正确
     *
     * @param **token**
     * @return
     */
    public static boolean verify(String token) {
        try {
            Algorithm algorithm = Algorithm.HMAC256(TOKEN_SECRET);
            JWTVerifier verifier = JWT.require(algorithm).build();
            DecodedJWT jwt = verifier.verify(token);
            return true;
        } catch (Exception e) {
            return false;
        }
    }

    /**
     * 从token中获取username信息
     *
     * @param **token**
     * @return
     */
    public static String getUserName(String token) {
        try {
            DecodedJWT jwt = JWT.decode(token);
            return jwt.getClaim("loginName").asString();
        } catch (JWTDecodeException e) {
            e.printStackTrace();
            return null;
        }
    }


}
